package com.cskaoyan.javase.object._6clone.empty;

/**
 * 空接口的作用
 * 实现一个空接口,表面上看该类不会新增任何成员
 * 但是一个类实现接口,它的数据类型就发生了变化:
 *      从原先不是该接口的实现类,变成了实现类
 *
 * instanceof关键字
 * 引用 instanceof 类名/接口名
 * 表示判断引用所指向的对象是否是后面类名的对象或者子类对象
 * 注:如果是抽象类和接口,那么只可能是子类对象
 *
 * 那么实现空接口,使用instanceof关键字就可以对某个对象的类型做判断了:
 * 1.如果instanceof关键字语法返回true,说明实现了空接口,就可以做一些操作
 * 2.如果instanceof关键字语法返回false,说明没有实现空接口,那就可以做另外的操作了
 *
 * 实际上Object类当中clone方法和java.lang.Cloneable就是使用instanceof去做判断的
 * 像Cloneable这种没有任何成员定义的空接口,起着标记作用的接口,称之为标记接口.
 *
 *
 * @since 17:05
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        A a = new A();
        judgeInstanceImplCloneable(a);
    }

    // 该方法用于判断对象是否实现空接口
    public static void judgeInstanceImplCloneable(Object o) {
        if (o instanceof Cloneable){
            // 说明o指向的对象是Cloneable的子类对象,那么这个A肯定实现接口Cloneable
            System.out.println("实现了空接口Cloneable,允许做克隆操作!");
            return;
        }
        System.out.println("没有实现空接口Cloneable,不允许做克隆操作,抛出异常!");
    }
}

class A implements Cloneable{
}

interface Cloneable {
}